package com.zxw.third.config;

import cn.hutool.core.collection.CollUtil;
import com.zxw.common.entity.baidu.BaiduHotEntity;
import com.zxw.common.entity.baidu.BaiduHotQuery;
import com.zxw.common.entity.baidu.BaiduHotVO;
import com.zxw.common.entity.bizjob.BizJobQuery;
import com.zxw.common.utils.DateUtil;
import com.zxw.common.utils.HotUtil;
import com.zxw.third.service.BaiduHotService;
import com.zxw.third.service.BizJobService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 定时任务
 */
@Configuration
@EnableScheduling
@Slf4j
@Component
public class MyScheduleTask {

    @Autowired
    private BaiduHotService baiduHotService;
    @Autowired
    private BizJobService bizJobService;

    //    每隔5秒执行一次：*/5 * * * * ?
    //    每隔1分钟执行一次：0 */1 * * * ?
    //    每天23点执行一次：0 0 23 * * ?
    //    每天凌晨1点执行一次：0 0 1 * * ?
    //    每月1号凌晨1点执行一次：0 0 1 1 * ?
    //    每月最后一天23点执行一次：0 0 23 L * ?
    //    每周星期天凌晨1点实行一次：0 0 1 ? * L
    //    在26分、29分、33分执行一次：0 26,29,33 * * * ?
    //    每天的0点、13点、18点、21点都执行一次：0 0 0,13,18,21 * * ?
    @Scheduled(cron = "0 0 1 * * ?")
    private void configureTasks() {
        // 定时任务开始执行时间
        Date start_time = new Date();
        // 定时任务名称
        String job_desc = "获取百度热点新闻";
        // 执行定时任务线程名称
        String threadName = Thread.currentThread().getName();
        try {
            // 删除老数据
            List<BaiduHotEntity> list = this.baiduHotService.list();
            if (CollUtil.isNotEmpty(list)) {
                this.baiduHotService.removeByIds(list.stream().map(BaiduHotEntity::getId).collect(Collectors.toList()));
            }
            // 重新获取新数据并入库
            List<BaiduHotVO> baiduHotVOList = HotUtil.grabBaiduHotNewsJson();
            if (CollUtil.isNotEmpty(baiduHotVOList)) {
                List<BaiduHotQuery> baiduHotQueryList = baiduHotVOList.stream().map(e -> {
                    BaiduHotQuery query = new BaiduHotQuery();
                    BeanUtils.copyProperties(e, query);
                    return query;
                }).collect(Collectors.toList());
                this.baiduHotService.saveBatch(baiduHotQueryList);
            }
            // 入库数据条数
            int len = baiduHotVOList.size();
            // 定时任务执行完成时间
            Date end_time = new Date();
            // 定时任务执行时长，单位秒
            long difSeconds = DateUtil.getDifSeconds(start_time, end_time);

            BizJobQuery bizJobQuery = new BizJobQuery();
            bizJobQuery.setJobDesc(job_desc);
            bizJobQuery.setThreadName(threadName);
            bizJobQuery.setLen(len);
            bizJobQuery.setStartTime(start_time);
            bizJobQuery.setEndTime(end_time);
            bizJobQuery.setDuring(difSeconds);
            bizJobService.save(bizJobQuery);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}